
#import "PywAppInfo.h"
#import <AdSupport/ASIdentifierManager.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
#import <UIKit/UIKit.h>
#import <ifaddrs.h>
#import <arpa/inet.h>
#import "sys/utsname.h"
#import "AppUtil.h"
#import "MutableDictionary.h"
#import "PywResourceUtils.h"

@implementation PywAppInfo

@synthesize gameKey;
@synthesize apisecret;
@synthesize gameId;
@synthesize is_applepay;
@synthesize dialog_time;
@synthesize is_float;
@synthesize sdk_api_url;
@synthesize sdk_pay_url;
@synthesize th_ch_id;//三方渠道id
@synthesize notice_url;//公告地址

signleton_m(AppInfo)

- (instancetype)init
{
    self = [super init];
    if (self) {
        _pay_type_order = nil;
        _appType = AppTypeUNKNOWN;
    }
    return self;
}

- (void)dealloc {
    self.uuid = nil;
}
- (NSString *)uuid{
    return _uuid ? _uuid : [self getDeviceId];
}

/// 系统名称
- (NSString *)sysName{
    if (!_sysName) {
        _sysName = [[UIDevice currentDevice] systemName];
    }
    return _sysName;
}
/// 设备型号
- (NSString *)model
{
    NSString *deviceModel = [self getDeviceName];
    if (deviceModel.length > 0) {
        _model = deviceModel;
    }else{
        _model = [[UIDevice currentDevice] model];
    }
    return _model;
}
// ip 地址
- (NSString *)ip_address
{
    if (!_ip_address) {
        _ip_address = [self getIPAddress];
    }
    return _ip_address;
}

// Get IP Address
- (NSString *)getIPAddress {
    NSString *address = @"error";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    // retrieve the current interfaces - returns 0 on success
    success = getifaddrs(&interfaces);
    if (success == 0) {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while(temp_addr != NULL) {
            if(temp_addr->ifa_addr->sa_family == AF_INET) {
                // Check if interface is en0 which is the wifi connection on the iPhone
                if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
                    // Get NSString from C String
                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    // Free memory
    freeifaddrs(interfaces);
    return address;
}

// 获取设备型号然后手动转化为对应名称
- (NSString *)getDeviceName
{
    // 需要#import "sys/utsname.h"
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    
    if ([deviceString isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
    if ([deviceString isEqualToString:@"iPhone3,2"])    return @"iPhone 4";
    if ([deviceString isEqualToString:@"iPhone3,3"])    return @"iPhone 4";
    if ([deviceString isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([deviceString isEqualToString:@"iPhone5,1"])    return @"iPhone 5";
    if ([deviceString isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
    if ([deviceString isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
    if ([deviceString isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
    if ([deviceString isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
    if ([deviceString isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
    if ([deviceString isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
    if ([deviceString isEqualToString:@"iPhone8,4"])    return @"iPhone SE";
    // 日行两款手机型号均为日本独占，可能使用索尼FeliCa支付方案而不是苹果支付
    if ([deviceString isEqualToString:@"iPhone9,1"])    return @"国行、日版、港行iPhone 7";
    if ([deviceString isEqualToString:@"iPhone9,2"])    return @"港行、国行iPhone 7 Plus";
    if ([deviceString isEqualToString:@"iPhone9,3"])    return @"美版、台版iPhone 7";
    if ([deviceString isEqualToString:@"iPhone9,4"])    return @"美版、台版iPhone 7 Plus";
    
    if ([deviceString isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
    if ([deviceString isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
    if ([deviceString isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
    if ([deviceString isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
    if ([deviceString isEqualToString:@"iPod5,1"])      return @"iPod Touch (5 Gen)";
    
    if ([deviceString isEqualToString:@"iPad1,1"])      return @"iPad";
    if ([deviceString isEqualToString:@"iPad1,2"])      return @"iPad 3G";
    if ([deviceString isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
    if ([deviceString isEqualToString:@"iPad2,2"])      return @"iPad 2";
    if ([deviceString isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([deviceString isEqualToString:@"iPad2,4"])      return @"iPad 2";
    if ([deviceString isEqualToString:@"iPad2,5"])      return @"iPad Mini (WiFi)";
    if ([deviceString isEqualToString:@"iPad2,6"])      return @"iPad Mini";
    if ([deviceString isEqualToString:@"iPad2,7"])      return @"iPad Mini (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPad3,1"])      return @"iPad 3 (WiFi)";
    if ([deviceString isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPad3,3"])      return @"iPad 3";
    if ([deviceString isEqualToString:@"iPad3,4"])      return @"iPad 4 (WiFi)";
    if ([deviceString isEqualToString:@"iPad3,5"])      return @"iPad 4";
    if ([deviceString isEqualToString:@"iPad3,6"])      return @"iPad 4 (GSM+CDMA)";
    if ([deviceString isEqualToString:@"iPad4,1"])      return @"iPad Air (WiFi)";
    if ([deviceString isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
    if ([deviceString isEqualToString:@"iPad4,4"])      return @"iPad Mini 2 (WiFi)";
    if ([deviceString isEqualToString:@"iPad4,5"])      return @"iPad Mini 2 (Cellular)";
    if ([deviceString isEqualToString:@"iPad4,6"])      return @"iPad Mini 2";
    if ([deviceString isEqualToString:@"iPad4,7"])      return @"iPad Mini 3";
    if ([deviceString isEqualToString:@"iPad4,8"])      return @"iPad Mini 3";
    if ([deviceString isEqualToString:@"iPad4,9"])      return @"iPad Mini 3";
    if ([deviceString isEqualToString:@"iPad5,1"])      return @"iPad Mini 4 (WiFi)";
    if ([deviceString isEqualToString:@"iPad5,2"])      return @"iPad Mini 4 (LTE)";
    if ([deviceString isEqualToString:@"iPad5,3"])      return @"iPad Air 2";
    if ([deviceString isEqualToString:@"iPad5,4"])      return @"iPad Air 2";
    if ([deviceString isEqualToString:@"iPad6,3"])      return @"iPad Pro 9.7";
    if ([deviceString isEqualToString:@"iPad6,4"])      return @"iPad Pro 9.7";
    if ([deviceString isEqualToString:@"iPad6,7"])      return @"iPad Pro 12.9";
    if ([deviceString isEqualToString:@"iPad6,8"])      return @"iPad Pro 12.9";
    
    if ([deviceString isEqualToString:@"i386"])         return @"Simulator";
    if ([deviceString isEqualToString:@"x86_64"])       return @"Simulator";
    
    return deviceString;
}


- (NSString *)sysVersion{
    if (!_sysVersion) {
        _sysVersion = [[UIDevice currentDevice] systemVersion];
    }
    return _sysVersion;
}

- (NSString *)tid
{
    _tid = [NSString stringWithFormat:@"%ld%@",[AppUtil getNowTimeStamp],self.uuid];
    if (_tid.length >= 16) {
        _tid = [[_tid stringByReplacingOccurrencesOfString:@"-" withString:@""] substringToIndex:16];
    }
    return _tid;
}

- (NSString *)verID{
    if (!_verID) {
        _verID = VERSION;  // SDK版本号
    }
    return _verID;
}


//当前系统时间的时间戳
- (NSString *)systemTimeSp
{
    NSDate *dateNow = [NSDate dateWithTimeIntervalSinceNow:0];
    NSTimeInterval interval = [dateNow timeIntervalSince1970]*1000;
    NSString *timeSp = [NSString stringWithFormat:@"%ld",(long)interval];
    return timeSp;
}

- (NSString *)promo_code
{
    if (!_promo_code) {
        _promo_code = [[self pywPromoDictionary] objectForKey:@"promo_code"];
    }
    return _promo_code;
}

- (NSString *)promo_channel
{
    if (!_promo_channel) {
        _promo_channel = [[self pywPromoDictionary] objectForKey:@"promo_channel"];
    }
    return _promo_channel;
}

- (NSString *)getDeviceId{
    
    float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    
    NSString *deviceId = [[NSString alloc] init];
    
    if (iosVersion >= 7.0) {
        // 获取idfa做为设备唯一标识
        deviceId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
        
    } else {
        deviceId = [self getMacAddress];
    }
    //    if (_uuid != deviceId)  _uuid = deviceId;
    //    return [[deviceId stringByReplacingOccurrencesOfString:@"-" withString:@""] substringToIndex:16];
    return [deviceId stringByReplacingOccurrencesOfString:@"-" withString:@""];
    
}

- (NSString *)getMacAddress
{
    int                 mgmtInfoBase[6];
    char                *msgBuffer = NULL;
    size_t              length;
    unsigned char       macAddress[6];
    struct if_msghdr    *interfaceMsgStruct;
    struct sockaddr_dl  *socketStruct;
    NSString            *errorFlag = NULL;
    
    // Setup the management Information Base (mib)
    mgmtInfoBase[0] = CTL_NET;        // Request network subsystem
    mgmtInfoBase[1] = AF_ROUTE;       // Routing table info
    mgmtInfoBase[2] = 0;
    mgmtInfoBase[3] = AF_LINK;        // Request link layer information
    mgmtInfoBase[4] = NET_RT_IFLIST;  // Request all configured interfaces
    
    // With all configured interfaces requested, get handle index
    if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0)
        errorFlag = @"if_nametoindex failure";
    else
    {
        // Get the size of the data available (store in len)
        if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0)
            errorFlag = @"sysctl mgmtInfoBase failure";
        else
        {
            // Alloc memory based on above call
            if ((msgBuffer = malloc(length)) == NULL)
                errorFlag = @"buffer allocation failure";
            else
            {
                // Get system information, store in buffer
                if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0)
                    errorFlag = @"sysctl msgBuffer failure";
            }
        }
    }
    
    // Befor going any further...
    if (errorFlag != NULL)
    {
        PLog(@"Error: %@", errorFlag);
        return errorFlag;
    }
    
    // Map msgbuffer to interface message structure
    interfaceMsgStruct = (struct if_msghdr *) msgBuffer;
    
    // Map to link-level socket structure
    socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1);
    
    // Copy link layer address data in socket structure to an array
    memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6);
    
    // Read from char array into a string object, into traditional Mac address format
    NSString *macAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
                                  macAddress[0], macAddress[1], macAddress[2],
                                  macAddress[3], macAddress[4], macAddress[5]];
    free(msgBuffer);
    return macAddressString;
}
/**
 *  分包渠道标识和分包黑金卡标识
 */
- (NSDictionary *)pywPromoDictionary
{
    MutableDictionary *promo_Dictionary = [[MutableDictionary alloc] init];
    NSURL *url = [[PywResourceUtils manger] anyObjct:@"pyw_promo" type:@"plist"];
    if (url.absoluteString.length > 7) {
        NSString *encodeURL = [url.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSString *plistPath = [encodeURL substringFromIndex:7];
        NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
        if (dictionary) {
            NSString *pyw_promo = dictionary[@"pyw_promo"];
            if (pyw_promo.length == 0) {
                [promo_Dictionary setValue:@"" forKey:@"promo_code"];
                [promo_Dictionary setValue:@"" forKey:@"promo_channel"];
                return promo_Dictionary;
            }
            if ([[pyw_promo substringToIndex:9] isEqualToString:@"pyw_promo"]) {
                NSString *chanel_code = [[pyw_promo componentsSeparatedByString:@"."] lastObject];
                NSArray *promos = [chanel_code componentsSeparatedByString:@"-"];
                if (promos.count > 0) {
                    NSString *chanel = [promos firstObject];
                    [promo_Dictionary setValue:chanel forKey:@"promo_code"];
                }
                if (promos.count > 1) {
                    NSString *code = [promos lastObject];
                    [promo_Dictionary setValue:code forKey:@"promo_channel"];
                }
            }
        }
    }
    return promo_Dictionary;
}
- (NSString *)bundle_Id
{
    return [[NSBundle mainBundle] bundleIdentifier];
}
- (NSString *)bundle_ver
{
    return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
}

@end
